﻿using System;
using System.IO;
using System.Data;
using System.Security.Cryptography;

namespace ServerRPG
{
    static class AccountManager
    {
        /// <summary>
        /// Добавить новую запись аккаунта в базу данных.
        /// </summary>
        /// <param name="login">Имя пользователя</param>
        /// <param name="password">Пароль</param>
        /// <returns></returns>
        public static bool Add(string login, string password)
        {
            if (Find(login))
                return false;

            if (login == String.Empty || password == String.Empty)
                return false;

            if (DBManager.ExecuteCommand("INSERT INTO Accounts(username, password, level, regdate) VALUES ('" + login + "', '" + GetHashString(password) + "', 1, '" + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + "')"))
                return true;
            else
                return false;
        }
        /// <summary>
        /// Проверяет таблицу аккаунтов на наличие пользователя.
        /// </summary>
        /// <param name="login"></param>
        /// <returns></returns>
        public static bool Find(string login)
        {
            DataTable dt = DBManager.Select("SELECT username FROM Accounts WHERE username = '" + login + "'");
            if (dt.Rows.Count == 1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// Проверить совпадение имени и пароля аккаунта в таблице базы данных.
        /// </summary>
        /// <param name="login"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public static bool Find(string login, string password)
        {
            DataTable dt = DBManager.Select("SELECT username, password FROM Accounts WHERE username = '" + login + "' AND password = '" + GetHashString(password) + "'");
            if (dt.Rows.Count == 1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// Изменить права пользователя.
        /// </summary>
        /// <param name="login">Пользователь</param>
        /// <param name="level">Уровень прав</param>
        /// <returns></returns>
        public static bool SetLevel(string login, int level)
        {
            if (DBManager.ExecuteCommand("UPDATE Accounts SET level = " + level + " WHERE username = '" + login + "'"))
                return true;
            else
                return false;
        }
        /// <summary>
        /// Получить права пользователя.
        /// </summary>
        /// <param name="login">Пользователь</param>
        /// <returns></returns>
        public static int GetLevel(string login)
        {
            System.Data.DataTable dt = DBManager.Select("SELECT level FROM Accounts WHERE username = '" + login + "'");
            if (dt.Rows.Count > 0)
                return (Convert.ToInt32(dt.Rows[0][0].ToString()));
            else
                throw new Exception("Ошибка получения прав для пользователя '" + login + "'");
        }
        /// <summary>
        /// Возвращает хеш-строку.
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string GetHashString(string s)
        {
            byte[] bytes = System.Text.Encoding.Unicode.GetBytes(s);
            MD5CryptoServiceProvider CSP = new MD5CryptoServiceProvider();
            byte[] byteHash = CSP.ComputeHash(bytes);
            string hash = String.Empty;
            foreach (byte b in byteHash)
                hash += string.Format("{0:x2}", b);

            return hash;
        }
        public static bool UpdateLoginDate(string login)
        {
            if (DBManager.ExecuteCommand("UPDATE Accounts SET logindate = '" + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + "' WHERE username = '" + login + "'"))
                return true;
            else
                return false;
        }
    }
}
